package com.effvi.jdk.socket;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * Socket文件接收（服务端）
 * @author kelvin.zhang
 *
 */
public class ReceiveFile implements Runnable{
	// static final int INPORT1 = 8888;//端口号  
    public void run() {  
        try {  
            ServerSocket server;
            int SERVERPORT = 200;
            StringBuffer ta1 = new StringBuffer("");
            server = new ServerSocket(SERVERPORT);  
            // 创建绑定到特定端口的服务器套接字。  
            Socket sock;// 创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。  
            while (true) {  
                sock = server.accept();// 侦听并接受到此套接字的连接  
                InetAddress addr = sock.getInetAddress();// 返回套接字连接的地址。  
                System.out.println(addr.getHostAddress());  

                // 使用指定的基础 InputStream 创建一个 DataInputStream。  
                DataInputStream infilename = new DataInputStream(sock.getInputStream());  
                // 从流infilename中读取用 UTF-8 修改版格式编码的 Unicode 字符格式的字符串；然后以String 形式返回此字符串。  
                String filename = new String(infilename.readUTF());  
                System.out.println("filename=" + filename);  
                ta1.append("File" + filename + " is from" + addr.getHostAddress() + "\n");  
                File file = new File("C:" + filename);// 创建一个File实例  
                // 当且仅当不存在具有此抽象路径名指定的名称的文件时，原子地创建由此抽象路径名指定的一个新的空文件。  
                file.createNewFile();  
                // 创建从中读取和向其中写入（可选）的随机存取文件流，该文件由 File 参数指定。  
                RandomAccessFile raf = new RandomAccessFile(file, "rw");  
                InputStream netIn = sock.getInputStream();// 返回此套接字的输入流。  
                // BufferedInputStream(netIn),创建 BufferedInputStream  
                // 并保存其参数，以便将来使用。  
                DataInputStream in = new DataInputStream(  
                        new BufferedInputStream(netIn));  
                byte[] buf = new byte[2048];  
                // 从所包含的输入流中读取一定数量的字节，并将它们存储到缓冲区数组 buf 中。  
                int num = in.read(buf);  
                if (num != (-1))  
                    ta1.append("File is sending...\n");  
                while (num != (-1))// 是否读完所有数据  
                {  
                    // 将 num 个字节从指定字节数组写入到此文件，并从偏移量 0处开始。  
                    raf.write(buf, 0, num);// 将数据写往文件  
                    // 尝试跳过输入的 num 个字节以丢弃跳过的字节。  
                    raf.skipBytes(num);// 顺序写文件字节  
                    num = in.read(buf);// 继续读取文件  
                }  
                if (num == (-1))  
                    ta1.append("The file has been saved to C disk" + "\n");  
                in.close();  
                raf.close();  
            }  
        } catch (Exception e) {  
            System.out.println("receive error!");  
        }  
    } 
}